
public class ListasCirculares<Tipo> {
	
	/**
	 * Atributos
	 */
	private Nodo<Tipo> tail;
	private int tam;
	
	/**
	 * Constructor de la clase
	 */
	public ListasCirculares()
	{
		tail=null;
		tam=0;
	}
	
	/**
	 * Método que agrega un elemento al principio de la lista
	 * @param dato
	 */
	public void addFirst(Tipo dato)
	{
		
		Nodo<Tipo> extra=new Nodo<Tipo>(dato);
		if(tail==null)
		{
			tail=extra;
			tail.setNext(tail);
		}else
		{
			extra.setNext(tail.next());
			tail.setNext(extra);
		}
		
		tam+=1;
	}
	
	/**
	 * Método que agrega un elemento al final de la lista
	 * @param dato
	 */
	public void addLast(Tipo dato)
	{
		addFirst(dato);
		tail=tail.next();
	}
	
	/**
	 * Método que devuelve el último elemento de la lista y lo borra
	 * @return
	 */
	public Tipo removeLast()
	{
		Nodo<Tipo> extra=tail;
		Nodo<Tipo> indice=tail;
		
		while(indice.next()!=tail)
			indice=indice.next();
		
		if(indice==tail)
		{
			tail=null;
		}else
		{
			indice.setNext(tail.next());
			tail=indice;
		}
		
		tam-=1;
		
		return extra.getElemento();
		
		
	}

	/**
	 * Método que devuelve el tamaño de la lista
	 * @return
	 */
	public int getTamano()
	{
		return tam;
	}
	
	/**
	 * Borra la lista
	 */
	public void clear()
	{
		tail=null;
		tail.setNext(null);
		tam=0;
	}

}
